Перейти к основному содержимому

5.14. Встроенные функции в Swift

Разработчику Архитектору

Встроенные функции в Swift

Swift использует набор зарезервированных слов для построения синтаксиса языка. Все ключевые слова разделены на логические группы по назначению.

Объявления и определения типов

Ключевое словоЗначениеПример
classОбъявление классаclass User { }
structОбъявление структурыstruct Point { }
enumОбъявление перечисленияenum Status { case active }
protocolОбъявление протоколаprotocol Drawable { }
extensionРасширение существующего типаextension String { }
funcОбъявление функцииfunc greet() { }
initОбъявление инициализатораinit(name: String) { }
deinitОбъявление деинициализатораdeinit { print("Удалён") }
varОбъявление переменнойvar count = 0
letОбъявление константыlet pi = 3.14
typealiasСоздание псевдонима типаtypealias ID = String
associatedtypeОбъявление ассоциированного типа в протоколеassociatedtype Element
operatorОбъявление пользовательского оператораoperator infix **
precedencegroupОпределение приоритета оператораprecedencegroup PowerPrecedence { }
subscriptОбъявление индексатораsubscript(index: Int) -> String { }

Модификаторы доступа и контекста

Ключевое словоЗначениеПример
privateОграничение видимости текущим объявлениемprivate var secret: String
fileprivateОграничение видимости текущим файломfileprivate func helper() { }
internalВидимость в пределах модуля (по умолчанию)internal class Service { }
publicВидимость за пределами модуляpublic struct API { }
openВидимость с возможностью переопределения извне модуляopen class Base { }
staticПринадлежность типу, а не экземпляруstatic let version = "1.0"
finalЗапрет наследования или переопределенияfinal class Singleton { }
mutatingРазрешение изменения свойств в методе структурыmutating func update() { }
nonmutatingУказание отсутствия изменения состоянияnonmutating func copy() -> Self
lazyОтложенная инициализация свойстваlazy var cache = loadCache()
overrideПереопределение метода или свойства базового классаoverride func draw() { }
convenienceВспомогательный инициализаторconvenience init() { self.init(id: 0) }
requiredОбязательный инициализатор для наследниковrequired init(coder: NSCoder) { }
indirectРазрешение рекурсивных случаев в перечисленииindirect case node(Tree)

Управляющие конструкции потока выполнения

Ключевое словоЗначениеПример
ifУсловное выполнениеif count > 0 { }
elseАльтернативная ветка условияif valid { } else { }
switchМножественный выбор по значениюswitch status { case .active: break }
caseОбработка конкретного значения в switchcase .error(let msg):
defaultОбработка всех остальных случаевdefault: print("Неизвестно")
forЦикл по последовательностиfor item in items { }
inУказание диапазона или коллекции в циклеfor i in 0..<10 { }
whileЦикл с предусловиемwhile isActive { }
repeatЦикл с постусловиемrepeat { } while needsRetry
breakПрерывание цикла или ветки switchif done { break }
continueПереход к следующей итерации циклаif skip { continue }
fallthroughПродолжение выполнения в следующую ветку switchcase 1: fallthrough
guardРанний выход при невыполнении условияguard let user = user else { return }
returnВозврат значения из функцииreturn result
deferОтложенное выполнение при выходе из областиdefer { file.close() }
whereДополнительное условие в цикле или шаблонеfor item in items where item.active { }

Обработка ошибок

Ключевое словоЗначениеПример
throwГенерация ошибкиthrow NetworkError.timeout
throwsУказание возможности генерации ошибки в сигнатуреfunc load() throws -> Data
rethrowsПередача ошибки из параметра-замыканияfunc process(_ block: () throws -> Void) rethrows
tryВызов функции, которая может сгенерировать ошибкуlet data = try loadData()
try?Преобразование ошибки в опциональное значениеlet result = try? riskyOperation()
try!Принудительное игнорирование возможной ошибкиlet value = try! safeOperation()
catchОбработка перехваченной ошибкиdo { } catch { print(error) }
doБлок для перехвата ошибокdo { try operation() } catch { }

Типы и преобразования

Ключевое словоЗначениеПример
asПреобразование типаlet str = value as String
as?Условное преобразование в опциональный типlet num = value as? Int
as!Принудительное преобразование типаlet id = value as! UUID
isПроверка принадлежности к типуif item is Video { }
AnyПредставление любого типаfunc log(_ value: Any) { }
SelfТип текущего экземпляра в протоколеfunc copy() -> Self
selfСсылка на текущий экземплярself.name = name
superДоступ к реализации базового классаsuper.viewDidLoad()
nilОтсутствие значения для опционального типаvar user: User? = nil
trueЛогическое значение истиныlet active = true
falseЛогическое значение лжиlet disabled = false
_Игнорирование значения или параметраfor _ in 0..<5 { }

Свойства и наблюдатели

Ключевое словоЗначениеПример
getГеттер для вычисляемого свойстваvar title: String { get { return raw } }
setСеттер для вычисляемого свойстваset { raw = newValue }
willSetНаблюдатель перед изменением значенияwillSet { print("Будет: \(newValue)") }
didSetНаблюдатель после изменения значенияdidSet { updateUI() }
inoutПередача параметра по ссылкеfunc swap(_ a: inout Int, _ b: inout Int)

Управление памятью

Ключевое словоЗначениеПример
weakСлабая ссылка без увеличения счётчикаweak var delegate: Handler?
unownedНепринадлежащая ссылка без проверки на nilunowned let parent: Container
optionalОбъявление опционального требования в протоколе@objc optional func didLoad()

Прочие ключевые слова

Ключевое словоЗначениеПример
importИмпорт модуля или символаimport Foundation
someУказание существования конкретного типа (opaque types)func makeView() -> some View
dynamicРазрешение динамической диспетчеризации через Objective-C runtimedynamic var title: String
infixБинарный оператор между операндамиinfix operator **
prefixУнарный оператор перед операндомprefix operator ++
postfixУнарный оператор после операндаpostfix operator ++
leftЛевая ассоциативность оператораassociativity: left
rightПравая ассоциативность оператораassociativity: right
noneОтсутствие ассоциативности оператораassociativity: none

Ключевые слова Swift не могут использоваться в качестве идентификаторов без экранирования обратными кавычками. Например, допустимо написать `class` в контексте имени переменной, но это не рекомендуется для повышения читаемости кода.